package com.gouwudai.gobbs.service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.Cookie;

import com.gouwudai.gobbs.common.IPageList;
import com.gouwudai.gobbs.pojo.TbbsUserDetail;
import com.gouwudai.gobbs.pojo.TbbsUserInfo;
import com.gouwudai.gobbs.vo.UserLoginVO;
import com.litt.core.common.PageParam;
import com.litt.core.exception.BusiException;
import com.litt.core.exception.DBException;

/**
 * <pre>
 *  Title:TODO
 *  Description: TODO  
 * </pre>
 * 
 * @author <a href="mailto:littcai@hotmail.com">空心大白菜</a>
 * @date 2007-3-30
 * @version 1.0
 * <pre>
 * 修改记录
 *    修改后版本:     修改人：  修改日期:     修改内容: 
 * </pre>
 */
public interface IUserService {

	/**
	 * 用户注册
	 * @param params
	 * @return
	 */
	void doUserReg(HashMap userInfoMap, HashMap userDetailMap,
			Boolean saveDetailFlag) throws BusiException;

	/**
	 * 用户修改注册信息
	 * @param params
	 * @return
	 */
	void updateUser(HashMap userInfoMap, HashMap userDetailMap,
			Boolean saveDetailFlag) throws BusiException;

	/**
	 * 根据用户名获得用户信息
	 * @param userId
	 * @return
	 */
	TbbsUserInfo load(Integer id);

	/**
	 * 用户详细信息
	 * @param userId
	 * @return
	 * @throws DBException
	 */
	TbbsUserDetail loadDetail(Integer userId);

	/**
	 * 管理员更新用户积分、金币，用户空间等信息
	 * @param params
	 * @return
	 */
	void updateAdmin(HashMap params);

	void updatePassword(String password, Integer userId);

	/**
	 * 更新用户剩余空间
	 * @param userId
	 * @param size
	 * @throws DBException
	 */
    int updateUpfileUsedSize(Integer size, Integer userId);

	/**
	 * 更新用户头像
	 * @param userId
	 * @param personalPic
	 * @throws DBException
	 */
	void updatePersonalPic(String personalPic, Integer userId);

	/**
	 * 逻辑删除用户
	 * @param userId
	 * @return
	 * @throws DBException
	 */
	void deleteLogic(Integer userId);

	/**
	 * 逻辑恢复用户
	 * @param userId
	 * @return
	 * @throws DBException
	 */
	void doResumeLogic(Integer userId);

	/**
	 * 物理删除用户，该方法不推荐使用，目前也不使用，用户都是逻辑删除
	 * @param userId
	 * @return
	 * @throws DBException
	 */
	void delete(Integer userId);

	/**
	 * 根据用户名、密码问题和密码答案找到对应用户并生成新密码
	 * @param loginId
	 * @param passQuestion
	 * @param passAnswer
	 * @throws DBException
	 */
	void findPass(String loginId, String passQuestion, String passAnswer)
			throws BusiException;

	/**
	 * 查询所有有效用户
	 * @return
	 */
	List listAllActive();
    
    /**
     * 查询所有不是指定版面黑名单的有效用户.
     * 
     * @param classId 版面ID
     * 
     * @return the list
     */
    public List listAllClassActive(Integer classId);
    
    /**
     * 查询指定版面黑名单用户.
     * 
     * @param classId 版面ID
     * 
     * @return the list
     */
    public List listAllClassBlack(Integer classId);

	/**
	 * 查询所有等级为gradeId的有效用户
	 * @param gradeId
	 * @return
	 */
    public List listAllActiveByGrade(int gradeId);
    
	/**
	 * 查询所有等级为gradeIds的有效用户
	 * @param gradeIds
	 * @return
	 */
    public List listAllActiveByGrade(String gradeIds);
    

	IPageList listPage(PageParam pageParam);

	void AutoBindingTable(javax.servlet.http.HttpServletRequest request);

	UserLoginVO doUserLogin(String loginId, String password, String loginIp)
			throws BusiException;

	/**
	 * 判断Cookie中是否保存用户名密码
	 * @param cookies
	 * @param loginIp
	 * @throws DBException
	 * @throws BusiException
	 */
	UserLoginVO userLogin(Cookie[] cookies, String loginIp)
			throws BusiException;

	/**
	 * 游客方式登陆
	 * @param loginIp
	 * @return
	 * @throws DBException
	 * @throws BusiException
	 */
	UserLoginVO visitorLogin(String loginIp) throws BusiException;

	/**
	 * AJAX用户登陆
	 * @param loginId
	 * @param password
	 * @param loginIp
	 * @return
	 * @throws DBException
	 * @throws BusiException
	 */
	String userLoginAjax(String loginId, String password, String loginIp)
			throws BusiException;
    
    /**
     * AJAX用户登陆.
     * 
     * @param password 密码
     * @param validDays 有效期
     * @param loginId 用户名
     * @param hiddenFlag 是否隐身
     * @param userStyle 显示样式
     * @param loginIp 登陆IP
     * 
     * @return String AjaxReturn
     * 
     * @throws BusiException
     */
    public String userLoginAjax(String loginId,String password,String loginIp,Integer validDays,Integer userStyle,Integer hiddenFlag) throws BusiException; 
        

	/**
	 * AJAX游客方式登陆
	 * @param loginIp
	 * @return
	 * @throws DBException
	 * @throws BusiException
	 */
	UserLoginVO visitorLoginAjax(String loginIp) throws BusiException;

	void doUserLogout(Date lastLoginTime, String loginIp, Integer userId);

	/**
	 * 用户注册验证
	 * @param loginId
	 * @return
	 */
	void validateLoginId(String loginId) throws BusiException;

	/**
	 * EMAIL验证
	 * @param email
	 * @return
	 */
	void validateEmail(int userId, String email) throws BusiException;

	/**
	 * 口令强弱等级判定,强度算法有待商榷，功能基本实现
	 * 暂时未使用
	 * @param pass
	 * @return
	 */
	int rateUserPass(String pass);

}